package com.leetcode;

import java.util.HashMap;
import java.util.Map;

/**
 * 290. 单词规律
 *
 * @author fy
 * @date 2022/4/6 15:31
 */
public class Solution290 {

    /**
     * 使用两个HashMap来记录对应关系
     *
     * @param pattern
     * @param s
     * @return
     */
    public boolean wordPattern(String pattern, String s) {
        char[] patArr = pattern.toCharArray();
        String[] sArr = s.split(" ");
        if (patArr.length != sArr.length) {
            return false;
        }
        Map<Character, String> patMap = new HashMap<>(patArr.length);
        Map<String, Character> sMap = new HashMap<>(patArr.length);
        for (int i = 0; i < patArr.length; i++) {
            char pChar = patArr[i];
            String sStr = sArr[i];
            if (patMap.containsKey(pChar)) {
                if (!patMap.get(pChar).equals(sStr)) {
                    return false;
                }
            } else {
                patMap.put(pChar, sStr);
            }

            if (sMap.containsKey(sStr)) {
                if (sMap.get(sStr) != pChar) {
                    return false;
                }
            } else {
                sMap.put(sStr, pChar);
            }
        }
        return true;
    }

    public boolean wordPattern1(String pattern, String s) {
        // 单词规律，使用hashmap
        HashMap<Object, Integer> map = new HashMap<>();
        char[] p = pattern.toCharArray();
        String[] words = s.split(" ");
        // 如果对应单词数都不等，则表示规律不匹配，直接false
        if (p.length != words.length) {
            return false;
        }
        // 长度相等则继续考虑
        for (Integer i = 0; i < p.length; i++) {
            // 调用put方法时，如果已经存在一个相同的key，则返回的是前一个key对应的value，同时该key的新value覆盖旧value，
            // 如果是新的一个key，则返回的是null。
            if (map.put(p[i], i) != map.put(words[i], i)) {
                return false;
            }
        }
        return true;
    }

    public static void main(String[] args) {
        String pattern = "abba";
//        String s = "dog cat cat dog";
        String s = "dog dog dog dog";
        boolean res = new Solution290().wordPattern(pattern, s);
        System.out.println(res);
    }

}
